package org.jeecg.cn.edu.scau.vm.container.service;

import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.cn.edu.scau.vm.container.domain.VmContainerUsage;
import org.jeecg.cn.edu.scau.vm.exception.UpdateMachineTimeException;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.vo.LoginUser;

import java.util.List;
import java.util.Map;

public interface VmContainerUsageService extends IService<VmContainerUsage> {

    /**
     * 基于CAS思想实现的更新用户剩余机时的方法,机时单位:分钟
     *
     * @param userId        用户ID
     * @param remainingTime 上次查询得到的时间
     * @param targetTime    目标时间
     * @param retryTimes    重试次数
     * @return 更新是否成功
     */
    Boolean updateRemainIngTimeSafely(String userId, Integer remainingTime,
                                      Integer targetTime, Integer retryTimes)
            throws UpdateMachineTimeException;

    /**
     * 基于CAS思想实现的更新用户剩余机时的方法,机时单位:分钟
     *
     * @param userId     用户ID
     * @param targetTime 目标时间
     * @param retryTimes 重试次数
     * @return 更新是否成功
     */
    Boolean updateRemainIngTimeSafely(String userId, Integer targetTime, Integer retryTimes)
            throws UpdateMachineTimeException;

    /**
     * 增加用户机时
     *
     * @param userId     用户ID
     * @param targetTime 想要加上的时间
     * @param retryTimes 重试次数
     * @return 是否更新成功
     */
    Boolean addRemainIngTime(String userId, Integer targetTime, Integer retryTimes)
            throws UpdateMachineTimeException;

    /**
     * 减少用户机时
     *
     * @param userId     用户ID
     * @param targetTime 想要加上的时间
     * @param retryTimes 重试次数
     * @return 是否更新成功
     */
    Boolean minusRemainIngTime(String userId, Integer targetTime, Integer retryTimes)
            throws UpdateMachineTimeException;

    /**
     * 尝试为当前用户分配机时间
     *
     * @param loginUser   用户实例
     * @param machineTime 机时,单位分钟
     * @return true:分配成功,false:分配失败
     */
    Boolean tryAllocateMachineTime(LoginUser loginUser, Integer machineTime);

    /**
     * 为用户创建容器使用配置
     *
     * @param loginUser 用户实例
     * @return 是否创建完毕
     */
    VmContainerUsage createUsageForUser(LoginUser loginUser);

    /**
     * 获取用户剩余机时
     *
     * @param userId 用户ID
     * @return 剩余机时
     */
    Integer getRemainIngTime(String userId);

    /**
     * 封装缓存对象
     *
     * @param ids 用户IDS
     * @return 返回缓存的map
     */
    Map<String, VmContainerUsage> getUsageByIds(List<String> ids);

    /**
     * 通过userId获取用户当月配额信息
     *
     * @param userId 用户ID
     * @return 返回本月使用详情
     */
    VmContainerUsage getByUserId(String userId);

    /**
     * 获取用户当月配额
     *
     * @return 获取当前用户配额
     */
    Result<VmContainerUsage> getLoginUserUsage();

    void syncData();

}
